﻿using Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BLL
{
    public class Empresa_BLL
    {
        #region singleton
        private static Empresa_BLL instance;

        private Empresa_BLL() { }

        public static Empresa_BLL Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Empresa_BLL();
                }
                return instance;
            }
        }
        #endregion

        public bool VerificarEmpresaExiste(string nomeEmpresa)
        {
            hrpEntities hrp = new hrpEntities();
            return hrp.hrp_empresas.Any(e => e.nome == nomeEmpresa);
        }

        public bool verificarNIFEmpresaExiste(string nif)
        {
            hrpEntities hrp = new hrpEntities();
            return hrp.hrp_empresas.Any(e => e.nif == nif);
        }       

        public hrp_empresas ObterEmpresa(int id_cliente, int id_empresa)
        {
            hrpEntities hrp = new hrpEntities();
            return hrp.hrp_empresas.FirstOrDefault(e => e.id == id_empresa && e.id_cliente == id_cliente);
        }

        public void updateLogoEmpresa(int id_empresa, string logo, string userId, string userIp)
        {
            hrpEntities hrp = new hrpEntities();
            DateTime userTimestamp = DateTime.Now;
            hrp_empresas empresa = hrp.hrp_empresas.Where(e => e.id == id_empresa).FirstOrDefault();
            if (empresa != null)
            {
                CriarLog(hrp, ref empresa, userId, userIp, userTimestamp);
                empresa.logo = logo.ToString();
                hrp.SaveChanges();
            }
        }

        private void CriarLog(hrpEntities hrp, ref hrp_empresas empresa, string userId, string userIp, DateTime userTimestamp)
        {
            hrp_empresas_log empresaLog = new hrp_empresas_log();
            empresaLog.morada = empresa.morada;
            empresaLog.codigo_postal = empresa.codigo_postal;
            empresaLog.nif = empresa.nif;
            empresaLog.ss = empresa.ss;
            empresaLog.email = empresa.email;
            empresaLog.telefone = empresa.telefone;
            empresaLog.telemovel = empresa.telemovel;
            empresaLog.fax = empresa.fax;
            empresaLog.website = empresa.website;
            empresaLog.comentario = empresa.comentario;
            empresaLog.logo = empresa.logo;
            empresaLog.activo = empresa.activo;
            empresaLog.nome = empresa.nome;
            empresaLog.pais = empresa.pais;
            empresaLog.ramo_actividade =empresa.ramo_actividade;
            empresaLog.data_registo = empresa.data_registo;
            empresaLog.user_id = empresa.user_id;
            empresaLog.user_ip = empresa.user_ip;
            empresaLog.user_timestamp = empresa.user_timestamp;

            empresaLog.id_empresa = empresa.id;
            empresaLog.log_user_id = userId;
            empresaLog.log_user_ip = userIp;
            empresaLog.log_user_timestamp = userTimestamp;
            hrp.hrp_empresas_log.Add(empresaLog);
        }

        public int criarEmpresa(int numeroCliente, string numeroUser, string nomeEmpresa, string moradaEmpresa, string codigoPostal,
           int paisId, string logo, string nif, string ss, string email, string telefone, string telemovel,
           string fax, int ramo, string ip, string website, string sobreempresa)
        {
            int result = 0;
            try
            {

                hrpEntities hrp = new hrpEntities();
                hrp_empresas novaEmpresa = new hrp_empresas();
                DateTime currentDate = DateTime.Now;
                //campos que nao voltam a ser actualizados
                novaEmpresa.id_cliente = numeroCliente;
                novaEmpresa.activo = true;
                novaEmpresa.data_registo = currentDate;

                //campos passiveis de serem actualizados
                novaEmpresa.codigo_postal = codigoPostal;
                novaEmpresa.comentario = sobreempresa;
                novaEmpresa.email = email;
                novaEmpresa.fax = fax;
                novaEmpresa.logo = logo.ToString();
                novaEmpresa.morada = moradaEmpresa;
                novaEmpresa.nif = nif;
                novaEmpresa.nome = nomeEmpresa;                
                novaEmpresa.pais = paisId;
                novaEmpresa.ramo_actividade = ramo;
                novaEmpresa.ss = ss;
                novaEmpresa.telefone = telefone;
                novaEmpresa.telemovel = telemovel;               
                novaEmpresa.website = website;
                

                novaEmpresa.user_id = numeroUser;
                novaEmpresa.user_ip = ip;
                novaEmpresa.user_timestamp = currentDate;

                hrp.hrp_empresas.Add(novaEmpresa);
                hrp.SaveChanges();
                result = novaEmpresa.id;
            }
            catch (Exception)
            {

                throw;
            }


            return result;
        }

        public void updateDadosEmpresa(int id_empresa, string morada, string codigopostal, string nif, string ss,
            string email, string telefone, string telemovel, string fax, string website, string sobreempresa,
            string userId, string userIp, string nome, int paisId, int ramoActividade)
        {
            hrpEntities hrp = new hrpEntities();
            DateTime userTimestamp = DateTime.Now;
            hrp_empresas empresa = hrp.hrp_empresas.Where(e => e.id == id_empresa).FirstOrDefault();
            if (empresa != null)
            {
                CriarLog(hrp, ref empresa, userId, userIp, userTimestamp);
                empresa.morada = morada;
                empresa.codigo_postal = codigopostal;
                empresa.comentario = sobreempresa;
                empresa.nif = nif;
                empresa.ss = ss;
                empresa.email = email;
                empresa.telefone = telefone;
                empresa.telemovel = telemovel;
                empresa.fax = fax;
                empresa.website = website;                
                empresa.nome = nome;
                empresa.pais = paisId;
                empresa.ramo_actividade = ramoActividade;

                empresa.user_id = userId;
                empresa.user_ip = userIp;
                empresa.user_timestamp = userTimestamp;
                hrp.SaveChanges();
            }
        }


        public void activarEmpresaUser(int idempresa, int iduser, bool active) 
        {
            hrpEntities hrp = new hrpEntities();
            hrp_users_empresas hrp_user_emp = new hrp_users_empresas();
            hrp_user_emp.activo = active;
            hrp_user_emp.id_empresa = idempresa;
            hrp_user_emp.id_user = iduser;
            hrp_user_emp.nivel_acesso = 20;
            hrp.hrp_users_empresas.Add(hrp_user_emp);
            hrp.SaveChanges();
        }

        public void activarEmpresaUserUpdate(int idempresa, int iduser, bool active)
        {
            hrpEntities hrp = new hrpEntities();
            hrp_users_empresas hrp_user_emp = hrp.hrp_users_empresas.FirstOrDefault(c=>c.id_empresa == idempresa && c.id_user == iduser );
            hrp_users_empresas hrp_user_emp_novo = new hrp_users_empresas();
            if (hrp_user_emp != null)
            {
                hrp_user_emp.activo = active;
                hrp_user_emp.id_empresa = idempresa;
                hrp_user_emp.id_user = iduser;
                hrp_user_emp.nivel_acesso = 20;
               
                hrp.SaveChanges();
            }
            else {
                hrp_user_emp_novo.activo = active;
                hrp_user_emp_novo.id_empresa = idempresa;
                hrp_user_emp_novo.id_user = iduser;
                hrp_user_emp_novo.nivel_acesso = 20;
                hrp.hrp_users_empresas.Add(hrp_user_emp_novo);
                hrp.SaveChanges();
            }
            
        }

        public hrp_empresas_log ObterPrimeiroLogEmpresa(int id_empresa)
        {
            hrpEntities hrp = new hrpEntities();
            return hrp.hrp_empresas_log.FirstOrDefault(e => e.id == id_empresa);
        }

        public List<hrp_users_empresas> empresasUserActivas(int iduser)
        {
            hrpEntities hrp = new hrpEntities();
            var empresas = from empresa in hrp.hrp_users_empresas
                           where empresa.id_user == iduser && empresa.activo == true
                           select empresa;
            return empresas.ToList();
        }

        public hrp_paises DadosPaisdaEmpresa(int empresaId)
        {
            hrpEntities hrp = new hrpEntities();
            var pais = 
                       from empresa in hrp.hrp_empresas
                       join paises in hrp.hrp_paises on empresa.pais equals paises.id
                       where empresa.id == empresaId
                       select paises;

            return pais.FirstOrDefault();
        }


    

    }
}
